import rasterio
import csv
import numpy as np
from pyproj import Transformer
import os
from rasterio.crs import CRS

# 指定要处理的单个 TIF 文件路径
tif_file = 'Landset8_20240925.tif'  # 替换为您的文件名
# CSV 文件保存的新文件夹路径

# 提取时间
date = tif_file.split('_')[1].split('.')[0]  # 假设时间在第二个下划线分隔的部分
print(f"提取的时间为: {date}")

# 提取卫星名（假设卫星名在第一个下划线分隔的部分）
satellite_name = tif_file.split('_')[0]
print(f"卫星名为: {satellite_name}")

# 定义波段名称映射
LC57_BANDS = ['SR_B1', 'SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B7', 'ST_B6']  # Landsat 5/7
LC89_BANDS = ['SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B6', 'SR_B7', 'ST_B10']  # Landsat 8/9

if satellite_name in ['Landset5', 'Landset7']:
    band_names = LC57_BANDS
elif satellite_name in ['Landset8', 'Landset9']:
    band_names = LC89_BANDS
else:
    band_names = []  # 处理未知的卫星名称
    print("未知的卫星名，请检查文件名。")

# 打印选定的波段以确认
print(f"选定的波段为: {band_names}")

# CSV 文件的完整路径
csv_file =os.path.basename(tif_file).replace('.tif', '.csv')

# 打开 TIF 文件
with rasterio.open(tif_file) as src:
    # 获取波段数量
    band_count = src.count
    print(f"{os.path.basename(tif_file)} 波段数量: {band_count}")

    # 获取波段数据的行数和列数
    rows, cols = src.read(1).shape

    # 读取波段数据
    bands_data = np.zeros((band_count, rows, cols), dtype=src.read(1).dtype)
    for band in range(1, band_count + 1):
        bands_data[band - 1] = src.read(band)

    # 获取当前影像的投影坐标系（比如 UTM）到经纬度的转换
    # transformer = None
    transformer = Transformer.from_crs("epsg:32649", "epsg:4326")

    # 打开 CSV 文件进行写入
    with open(csv_file, mode='w', newline='') as file:
        writer = csv.writer(file)

        # 写入 CSV 文件的表头
        header = ['longitude', 'latitude']
        header.extend(band_names[:band_count])  # 只使用与波段数量相等的波段名称
        writer.writerow(header)

        # 遍历每个像素
        for row in range(rows):
            for col in range(cols):
                # 获取像素的投影坐标（x, y）
                x, y = src.xy(row, col)

                # 如果影像是投影坐标系，则转换为经纬度（WGS84）
                if transformer:
                    lon, lat = transformer.transform(x, y)
                else:
                    lon, lat = x, y  # 如果已经是经纬度坐标系

                # 获取每个波段的值
                values = bands_data[:, row, col]

                # 写入一行数据
                writer.writerow([lon, lat] + values.tolist())

    print(f"{os.path.basename(tif_file)} 数据已导出到 {csv_file}")